import { getToken, removeToken, setToken } from '@/utils/auth'
import { login, userInfoDetailRequest, userInfoRequest } from '@/api/user'

export default {
  namespaced: true, // 外面额module才能生效
  state: {
    // 每次刷新的时候，必须先从cookie里面获取，如果没有，在赋值为空字符串
    // 存储token
    token: getToken() || '',
    // 存储用户信息对象
    userInfo: {}
  },
  // getters: {},// 一般不用
  mutations: { // 同步修改数据的地方
    // 定义 mutations 函数: 获取 登录请求传递过来的参数 token, 修改 state 中的 token
    newToken(state, params) {
      state.token = params
      // 如果不持久化保存，浏览器一刷新，token就没有了
      setToken(params)
    },
    // 修改 userInfo 用户个人信息
    setUserIngo(state, payload) {
      state.userInfo = payload
    },
    // 清除 token
    removeToken(state) {
      state.token = ''
      // 清空 cookie 中储存的 token
      removeToken()
    },
    // 清空用户信息 userInfo
    removeUserInfo(state) {
      state.userInfo = {}
    }
  },
  actions: {
    // 登录模块发送请求
    // context 就是当前模块的一个 store实例
    async loginAction(context, payload) {
      const res = await login(payload)
      // 下面代码的说，不管是同步还是异步，最终修改state的地方都是在mutation （只能mutation里面去修改）
      context.commit('newToken', res.data)
    },
    // 首页-发送请求获取用户信息
    async getUserInfoActions(context, payload) {
      try {
        // 发送请求, 获取用户个人信息
        const res = await userInfoRequest()

        // 调用 获取用户详情的接口, 并传入一个参数 id
        const detail = await userInfoDetailRequest(res.data.userId)

        // 利用 context对象的commit, 调用mutations函数修改 userInfo
        // 将获取到的 基本用户信息 与 用户详细信息 合并到一个对象中 传给 mutations 函数对state 数据进行修改
        // console.log({ ...res.data, ...detail.data })
        context.commit('setUserIngo', { ...res.data, ...detail.data })
        // 返回当前用户所拥有的的页面权限
        return res.data.roles.menus
      } catch (err) {
        console.log('获取用户详细个人信息错误', err)
      }
    },
    // actions 里面不一定必须要放 异步任务, 他也可以用来调用多个 mutations 函数
    // 退出登录
    logout(context) {
      // 调用 mutations 函数, 清空 token 与 用户信息 userInfo
      context.commit('removeToken')
      context.commit('removeUserInfo')
    }
  }
}
